﻿#ifndef ZMULTITHREADTASK_H
#define ZMULTITHREADTASK_H

/*******************************************************************************
** 多线程任务类，基类。其子类对象为主线程对象，仅仅执行发生在子线程中。
** 其信号槽响应只能在主线程中，且主线程必须有消息循环。
** 这就是和QThread的区别，QThread在moveToThread后，槽函数可以在线程中执行。
*******************************************************************************/

#include <QObject>
#include <QSharedPointer>
#include <QRunnable>

#include "ZFCommonHeader.h"

ZFLIB_BEGIN_NAMESPACE

class ZFLIB_API ZMultiThreadTask : public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit ZMultiThreadTask(QObject *parent = 0);
    virtual ~ZMultiThreadTask();

    // 任务类型
    virtual int type() = 0;

    // 任务名称（可选）
    virtual QString taskName();

    // 获取任务信息内容（可选）
    virtual QString toString();

    // 停止当前执行，用于快速退出
    virtual void stopCurrent() = 0;

    // 执行任务函数，子类必须实现
    virtual void doTask() = 0;

    // 获取错误码
    virtual int getLastError();

    // 获取错误信息
    virtual QString getLastErrorString();

signals:
    // 执行进度，可由子类发出
    void sigProgress(int);

    /**
     * @brief sigProgressStart
     *  开始执行信号，私有信号
     */
    void sigProgressStart(QPrivateSignal);

    /**
     * @brief sigProgressFinsihed
     *  结束执行，私有信号
     */
    void sigProgressFinished(QPrivateSignal);

private:
    // 执行核心函数
    virtual void run();

    // 私有化此函数
    void setAutoDelete(bool auto_delete);
};

ZFLIB_END_NAMESPACE

#endif // ZMULTITHREADTASK_H
